package jtracking_both;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

/**
 * repräsentiert ein Paket von Daten, das an den Server geschickt werden soll
 *
 */
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.3988AE3A-18B2-E97B-0AB7-7B00E1908F92]
// </editor-fold>
public class Datenpaket implements Serializable{

    /**
     * eine IP-Addresse, als byte[4] Array
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.CB5919E1-0523-CFF5-AB72-2337C9E7B8AF]
    // </editor-fold>
    private byte[] iPAddress;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.3210D4AB-6B38-7B49-DE02-B52B73C21847]
    // </editor-fold>
    private String username;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.72E9CAD3-9784-AA98-460B-637D20187E66]
    // </editor-fold>
    private String hostname;

    private String raum;

    /**
     * der dem Paket zugehörige Zeitpunkt
     */
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.E90DC8F8-DD6F-8175-56E3-82F63C105A78]
    // </editor-fold>
    private Timestamp datum;




    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.476A1C3C-A68A-C8DF-792C-FE8F4E1AB249]
    // </editor-fold>
    public Datenpaket (String username, String hostname,String raum, Timestamp datum, byte[] iPAddress)
    {
        this.username=username;
        this.hostname=hostname;
        this.raum=raum;
        this.datum=datum;
        this.iPAddress=iPAddress;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,regenBody=yes,id=DCE.99EDD3DC-A657-D352-C31B-8BF980C5F478]
    // </editor-fold>
    public Date getDatum () {
        return datum;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,regenBody=yes,id=DCE.7D1F5BDD-95B2-AD3E-4FDA-D9C348E56FE8]
    // </editor-fold>
    public String getHostname () {
        return hostname;
    }
    public String getRaum () {
        return raum;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,regenBody=yes,id=DCE.155DE4D4-1507-6705-E431-6EA514A45C52]
    // </editor-fold>
    public byte[] getIPAddress () {
        return iPAddress;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,regenBody=yes,id=DCE.188ED2CB-46CB-B1DE-86CE-E59B063FE873]
    // </editor-fold>
    public String getUsername () {
        return username;
    }


    /**
     * konvertiert eine "raw"-IP-Adresse in einen Numerischen Array
     * nur zu Ausgabezwecken.
     * @param ipAddress raw-byte array
     * @return short-numerical array
     */
    public static short[] ipAddressToNumerical(byte[] ipAddress)
    {
        short[] ip=new short[4];
        for(int i=0;i<4;i++)
        {
            ip[i]=(short) (ipAddress[i] & 0xff); //konvertiert in eine zahl,
            //ignoriert dabei das vorzeichen, da hier zahlen von 0-255 gespeichert werden,
            //anstatt -127 - 127, wie bei einem signed byte vorgesehen
        }
        return ip;
    }

    /**
     * konvertiert eine "raw"-IP-Adresse in einen String wie "127.0.0.1"
     * nur zu Ausgabezwecken.
     * @param ipAddress raw-byte array
     * @return dotted IP as String
     */
    public static String ipAddressToString(byte[] ipAddress)
    {
        short[] ips = ipAddressToNumerical(ipAddress);
        String ip="";
        for(int i=0;i<4;i++)
        {
            if(i!=0)
                ip=ip+".";
            ip=ip+ips[i];
        }
        return ip;
    }

    /**
     * Gibt einen String aus, der dieses Objekt beschreibt.
     * @return Klassenname[Hostname,IP-Adresse,Benutzername,Raum,Datum]
     *
     * Beispiel:
     * Datenpaket[W123456,1.3.3.7,hans.wurst,Tue Feb 13:37:00 GMT 2010]
     */
    @Override
    public String toString()
    {
        return getClass().getSimpleName()+"["+hostname+","+ipAddressToString(iPAddress)+","+username+","+raum+","+datum.toString()+"]";
    }
}
